/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.controller;

import br.com.folha.dao.GenericoDao;
import br.com.folha.dao.GradeDao;
import br.com.folha.dao.SalaDao;
import br.com.folha.dao.TurmaDao;
import br.com.folha.dao.UnidadeDao;
import br.com.folha.entity.GradeHoraria;
import br.com.folha.entity.GradeHorariaFp;
import br.com.folha.entity.Turma;
import br.com.folha.entity.TurmaAula;
import br.com.folha.entity.Unidade;
import br.com.folha.service.FolhaService;
import br.com.folha.service.GradeService;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author marceloml
 */
@ManagedBean(name = "AdminGradeController")
@ViewScoped
public class AdminGradeController implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private Unidade unidade;
    private Integer selectedUnidades;
    private Integer selectedTurma;
    private UnidadeDao unidadeDao = new UnidadeDao();
    private GenericoDao gradeDao = new GenericoDao();
    private GradeDao consulta = new GradeDao();
    
    private Turma turma;
    private TurmaDao turmaDao = new TurmaDao();
    
    private Date data = new Date();
    
    private GradeHoraria gradeHoraria;    
    private Set<Unidade> unidadeUsuario;
    
    private String dataIni;
    private String dataFim;
    private Long retorno;
    private Date dataCalculada;
    
    private SalaDao salaDao = new SalaDao();
    
    private LoginController usuarioLogado;
    private boolean resultado;
    private GradeHorariaFp folhaPagamento;
    
    private FolhaService folhaService = new FolhaService();
    
    public AdminGradeController(){
        
        gradeHoraria = new GradeHoraria();
        folhaPagamento = new GradeHorariaFp();
        selectedUnidades = 0;
        
        usuarioLogado = new LoginController();  
        
    }
    
    public Collection<SelectItem>  getCarregarUnidade(){                
        
        unidade = new Unidade();        
              
        Collection<SelectItem> lst = new ArrayList<SelectItem>(); 
        lst.add(new SelectItem(null, "Selecione a Unidade"));      //Primeiro item do select 
        
        unidadeUsuario = usuarioLogado.Usuario.getUnidades();                
        

        
            for (Iterator iterator = usuarioLogado.Usuario.getUnidades().iterator(); iterator.hasNext();){            
                Unidade unidade = (Unidade) iterator.next();             

                    lst.add(new SelectItem(unidade.getId(), unidade.getNome()));                                      

            }                
        
        return lst;                  
        
    }    
    
    public Collection<SelectItem>  getCarregarTurma(){
        
        turma = new Turma();                      
        Collection<SelectItem> lst = new ArrayList<SelectItem>(); 
        lst.add(new SelectItem(null, "Selecione a Turma"));      //Primeiro item do select 
        
        if(selectedUnidades != 0){                                  

            for (Iterator iterator = turmaDao.listaTurmaUnidade(selectedUnidades).iterator(); iterator.hasNext();){            
                Turma retornoTurma = (Turma) iterator.next();             

                    lst.add(new SelectItem(retornoTurma.getId(), retornoTurma.getNome()));                                      

            }                
        
        }
        
        return lst;                  
        
    }    
    
    public void geraGrade(){
        
        FacesMessage msg = null;  
        
        try{
        
            Calendar calendar = Calendar.getInstance(); // ou new GregorianCalendar  
            calendar.clear();  
            calendar.set(Calendar.YEAR,Integer.parseInt(this.dataIni.substring(6, 10)));
            calendar.set(Calendar.MONTH, Integer.parseInt(this.dataIni.substring(3, 5)) - 1);
            calendar.set(Calendar.DAY_OF_MONTH,Integer.parseInt(this.dataIni.substring(0, 2)));
            
            Calendar calendar2 = Calendar.getInstance(); // ou new GregorianCalendar  
            calendar2.clear();  
            calendar2.set(Calendar.YEAR,Integer.parseInt(this.dataFim.substring(6, 10)));
            calendar2.set(Calendar.MONTH, Integer.parseInt(this.dataFim.substring(3, 5)) - 1);
            calendar2.set(Calendar.DAY_OF_MONTH,Integer.parseInt(this.dataFim.substring(0, 2)));            

            retorno = consulta.consultaTurma(turmaDao.getById(selectedTurma), calendar.getTime(), calendar2.getTime());
            
            /*
             * Valida se ja existe grade gerada para a Turma no periodo escolhido
             */
            if(retorno != 0){
                
              msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Já existe grade gerada para a turma selecionada", "");
              FacesContext.getCurrentInstance().addMessage(null, msg);                                          
                
            /*
             * Caso não exista grade para a turma no periodo escolhido será gerada a grade
             */  
            }else{
                
                 List<TurmaAula> listaAula = turmaDao.listaTurmaAula(selectedTurma);                   
                 GradeService grade = new GradeService();                
                 
                 for(int j = 0; j < listaAula.size(); j++) {                                                                                     
                     
                 Calendar calendar3 = Calendar.getInstance(); // ou new GregorianCalendar  
                 calendar3.clear();  
                 calendar3.setTime(calendar.getTime());                                      
                     
                     while (calendar3.getTime().before(calendar2.getTime()) || calendar3.getTime().equals(calendar2.getTime())) {                                             

                        dataCalculada  = grade.calculaData(calendar3.getTime(), listaAula.get(j).getDiaSemana().getId());
                            System.out.println("Dia Atual :"+calendar3.getTime());
                            System.out.println("Dia da Semana :"+listaAula.get(j).getDiaSemana().getId());
                            if(calendar3.get(Calendar.DAY_OF_WEEK) == listaAula.get(j).getDiaSemana().getId()){

                                       gradeHoraria.setTurma(turmaDao.getById(selectedTurma));                    
                                       gradeHoraria.setDisciplina(listaAula.get(j).getDisciplina());
                                       gradeHoraria.setProfessor(listaAula.get(j).getProfessor());
                                       gradeHoraria.setUnidade(unidadeDao.getById(selectedUnidades));
                                       gradeHoraria.setHoraIni(listaAula.get(j).getHoraIni());
                                       gradeHoraria.setHoraFim(listaAula.get(j).getHoraFim());
                                       gradeHoraria.setTipoContrato(listaAula.get(j).getTipoContrato());
                                       gradeHoraria.setSala(salaDao.getById(listaAula.get(j).getSala().getId()));
                                       gradeHoraria.setMaterial(listaAula.get(j).getMaterial());
                                       gradeHoraria.setData(calendar3.getTime());
                                       gradeHoraria.setDt_cadastro(data);
                                       gradeHoraria.setUsuario_cadastro(usuarioLogado.getUsuario().getId());
                                       
                                       resultado = gradeDao.salvar(gradeHoraria);
                                       
                                       //Irá gerar junto com a grade horária a base para o apontamento
                                       Integer idGrade;
                                       idGrade = consulta.buscaUltRegistro();                                                                           
                                       
                                       folhaPagamento.setId_grade(idGrade);
                                       folhaPagamento.setTurma(turmaDao.getById(selectedTurma));
                                       folhaPagamento.setDisciplina(listaAula.get(j).getDisciplina());
                                       folhaPagamento.setProfessor(listaAula.get(j).getProfessor());
                                       folhaPagamento.setUnidade(unidadeDao.getById(selectedUnidades));
                                       folhaPagamento.setHoraIni(listaAula.get(j).getHoraIni());
                                       folhaPagamento.setHoraFim(listaAula.get(j).getHoraFim());
                                       folhaPagamento.setHoraIniOri(listaAula.get(j).getHoraIni());
                                       folhaPagamento.setHoraFimOri(listaAula.get(j).getHoraFim());                                       
                                       folhaPagamento.setTipoContrato(listaAula.get(j).getTipoContrato());
                                       folhaPagamento.setData(calendar3.getTime());
                                       folhaPagamento.setAtraso(calendar3.getTime());                                       
                                       
                                       Float valorAula = folhaService.getValor(folhaPagamento.getProfessor(), folhaPagamento.getUnidade(), folhaPagamento.getTurma(), folhaPagamento.getHoraIni(), folhaPagamento.getHoraFim());
                                       
                                       folhaPagamento.setValor(BigDecimal.valueOf(valorAula));
                                       
                                       gradeDao.salvar(folhaPagamento);  
                                
                            }
                                
                                calendar3.add(Calendar.DATE,1);
                     
                    }
                     
                     calendar3.clear();
                     calendar3.setTime(calendar.getTime());  

                 }
                 
                 if(resultado){
                     
                        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Grade Horária Gerada para o Período de "+dataIni+" até "+dataFim, "");
                        FacesContext.getCurrentInstance().addMessage(null, msg); 
                        
                        resetGrade();
                     
                 }
                
            }
            
        }catch(Exception e){
            
              msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao gerar grade "+e.getMessage(), "");
              FacesContext.getCurrentInstance().addMessage(null, msg);                          
            
        }
        
    }
    
    public void resetGrade(){
        
        this.selectedTurma    = 0;
        this.selectedUnidades = 0;
        this.dataIni = "";
        this.dataFim = "";
        
    }

    public Unidade getUnidade() {
        return unidade;
    }

    public void setUnidade(Unidade unidade) {
        this.unidade = unidade;
    }

    public Integer getSelectedUnidades() {
        return selectedUnidades;
    }

    public void setSelectedUnidades(Integer selectedUnidades) {
        this.selectedUnidades = selectedUnidades;
    }

    public GradeHoraria getGradeHoraria() {
        return gradeHoraria;
    }

    public void setGradeHoraria(GradeHoraria gradeHoraria) {
        this.gradeHoraria = gradeHoraria;
    }

    public Integer getSelectedTurma() {
        return selectedTurma;
    }

    public void setSelectedTurma(Integer selectedTurma) {
        this.selectedTurma = selectedTurma;
    }

    public String getDataIni() {
        return dataIni;
    }

    public void setDataIni(String dataIni) {
        this.dataIni = dataIni;
    }

    public String getDataFim() {
        return dataFim;
    }

    public void setDataFim(String dataFim) {
        this.dataFim = dataFim;
    }

    /**
     * @return the folhaPagamento
     */
    public GradeHorariaFp getFolhaPagamento() {
        return folhaPagamento;
    }

    /**
     * @param folhaPagamento the folhaPagamento to set
     */
    public void setFolhaPagamento(GradeHorariaFp folhaPagamento) {
        this.folhaPagamento = folhaPagamento;
    }
    
}
